package memento;

import java.awt.Color;
import java.awt.Font;
import java.util.List;

import javax.media.opengl.awt.GLJPanel;

import logica.Relacion;
import logica.RelacionException;
import vista.objetos.EntidadRolGraficable;
import vista.objetos.EstrategiaRelacionGraficable;
import vista.objetos.GraficableConEtiquetaConAtributos;
import vista.objetos.RelacionGraficable;

public class MementoRelacionGraficable extends MementoGraficableConAtributo {

	private IMemento relacion;
	private EstrategiaRelacionGraficable tipo;

	public MementoRelacionGraficable(RelacionGraficable relacionGraficable) 
	{
		super(relacionGraficable, relacionGraficable.getPunto());
		this.tipo = relacionGraficable.getTipo();
		this.relacion = ((Relacion)relacionGraficable.getObjetoDiagramaDecorado()).getMementoGenerico();
	}

	@Override
	void cargarGraficable()
	{
		super.cargarGraficable();
		super.cargarAtributos();
		cargarReferencias();
		RelacionGraficable relacionGraficable = (RelacionGraficable) super.getGuardable();
		relacionGraficable.setTipo(tipo);
	}

	@Override
	void cargarLogico() {
		this.relacion.cargarMemento();
	}
	
	@Override
	protected void cargarReferencias()
	{
		RelacionGraficable graficable = (RelacionGraficable) super.getGuardable();
		List<EntidadRolGraficable> listRefNuevos = graficable.getReferenciasExternas();
		
		try {
			graficable.setEntidadesRol(this.getReferenciasExternas());
		} catch (RelacionException e) {
			e.printStackTrace();
		}
		
		if (listRefNuevos != this.getReferenciasExternas() && graficable.getDiagrama().soyElDiagramaActual())
		{
			borrarDeHojaReferenaciasViejas(listRefNuevos);
			agregarAHojaReferenciasNuevos(graficable);
		}
	}
	
	private void borrarDeHojaReferenaciasViejas(List<EntidadRolGraficable> listRefViejas) 
	{
		for (EntidadRolGraficable entidadRolSeVa: listRefViejas)
			entidadRolSeVa.borrarseDeLaHoja();
	}
	
	private void agregarAHojaReferenciasNuevos(GraficableConEtiquetaConAtributos grafConReferencias) 
	{
		GLJPanel panel = grafConReferencias.getContenedor();
		Font fuente = grafConReferencias.getEtiqueta().getFont();
		Color color = grafConReferencias.getEtiqueta().getForeground();
		
		for (EntidadRolGraficable referencias: grafConReferencias.getReferenciasExternas() )
			referencias.agregarseAlCanvas(panel, fuente, color);
	}
}
